package com.szy.system.util;

import java.io.*;

/**
 * @author : zhenyun.su
 * @comment :
 * separator: window=/  unix=\ 例如：E:/6_Java/4_workdemo/spring_learning/0sources
 * pathSeparator: ;  例如：java   -cp   test.jar;abc.jar   HelloWorld
 * 功能说明：
 * getAppPath      获取应程序启动路径
 * getResourcePath 获取应用程序 classes路径
 * getTestResourcePath 获取应程序测试classes路径
 * getAppTempFile     按子路和文件名，生成绝对路径的时间抽文件， 用于文件上传的临时存放
 * getExtType      获取文件扩展名
 * checkFile       再保存文件前，检查路径是否存在， 文件是否已存在
 * fileWriteOutputStream 文件读入输出流中， 可用于下载文件
 * InStreamToOutStream   将输入流，通过缓冲的方式读入输出流中， 可用于下载文件
 *
 * 2021/02/20 -----
 *  convertFileName(String file)     temp.xlsx 转换为 temp_20210102173322.xlsx
 *  getByteArrayByFile(String file)  文件转换字节数组，用于文件下载
 * 2021/02/26 -----
 *  String getName(String fullName)  获取 temp.xlsx 从 /daphne/temp.xlsx
 *  Boolean existFile(String fileFullName) 判断文件是否存在
 *  fileWriteOutputStream 和 InStreamToOutStream 未来用 getByteArrayByFile和ServletUtils.setResponseExcel 来替代
 * 2021/03/01 -----
 *   getUserPath()  取得当前用户绝对路径, 替代 getAppPath()
 *   getUserPath(String subPath)  subPath 路径中 / 或 \ 符号自提替换为系统可识别
 *   getResourcePath(String subPath)
 * @since : 2020/1/22
 */

@Deprecated
public final class FileUtils {
    public static final String separator = File.separator;
    public static final String pathSeparator = File.pathSeparator;

    /**
     * @comment : maven项目，程序启动时的路径
     */
    public static String getAppPath() {
        return System.getProperty("user.dir") + separator;
    }

    /**
     * @comment : 当前用户的相对目录
     */
    public static String getUserPath() {
        return System.getProperty("user.dir") + separator;
    }


    public static String getUserPath(String subPath) {
        StringBuilder appPath = new StringBuilder(getUserPath());

        if ((subPath != null)&& (subPath.length() >= 1)){
            subPath = replaceSysPath(subPath);
            appPath.append(subPath).append(separator);
        }
        return appPath.toString();
    }

    /**
     * @comment : maven项目，生产环境war后jar包的资源路径
     */
    public static String getResourcePath() {
        return getAppPath() + "classes" + separator;
    }

    /**
     * @comment : maven项目，生产环境war后jar包的资源路径
     */
    public static String getResourcePath(String subPath) {
        StringBuilder resourcePath = new StringBuilder();
        resourcePath.append(getResourcePath());

        if ((subPath != null)&& (subPath.length() >= 1)){
            subPath = replaceSysPath(subPath);
            resourcePath.append(subPath).append(separator);
        }
        return resourcePath.toString();
    }

    public static String replaceSysPath(String subPath) {
        if ((subPath != null)&& (subPath.length() >= 1)){
            subPath = subPath.replace("\\", separator);
            subPath = subPath.replace("/", separator);
        }
        return subPath;
    }

    /**
     * @comment : maven项目，开发运行的资源路径
     */
    public static String getTestResourcePath() {
        return getAppPath() + separator + "target" + separator + "classes" + separator;
    }

    /**
     * @comment : 按子路和文件名，生成绝对路径的时间抽文件， 用于文件上传的临时存放
     */
    public static String getAppTempFile(String subPath, String originalFilename) {
        return getUserPath(subPath)+convertFileName(originalFilename);
    }

    /**
     * @comment : 获取文件扩展名
     */
    public static String getExtType(String filename) {
        final int index = filename.lastIndexOf(".") + 1;
        return filename.substring(index);
    }

    /**
     * @comment : 检查文件，为了保存文件
     * 文件已存在，则先删除
     * 目录不存在，自动创建
     */
    public static File checkFile(String fileName) {
        File file = new File(fileName);
        if (!file.exists()) {
            file.mkdirs();
        } else {
            file.delete();
        }
        return file;
    }
    /**
     * @comment :  获取 temp.xlsx 从 /daphne/temp.xlsx
     */
    public static String getName(String fullName) {
        return new File(fullName).getName();
    }
    /**
     * @comment :  判断文件是否存在
     */
    public static Boolean existFile(String fileFullName) {
        return new File(fileFullName).exists();
    }

    /**
     * @comment : 将文件读入输出流中， 可用于下载文件   , 未来放弃使用
     * @param: outputStream =HttpServletResponse.getOutputStream()
     * fileName 文件全称
     */
    public static void fileWriteOutputStream(OutputStream outputStream, String fileName) throws Exception {
        File file = new File(fileName);
        if (!file.exists()) {
            throw new Exception("file not exist");
        }
        InStreamToOutStream(outputStream, new FileInputStream(file));
    }

    /**
     * @comment : 将输入流，通过缓冲的方式读入输出流中， 可用于下载文件  未来放弃使用
     * @param: outputStream =HttpServletResponse.getOutputStream()
     * InputStream 输入流
     */
    public static void InStreamToOutStream(OutputStream outputStream, InputStream inStream) throws Exception {
        //创建缓冲输入流
        BufferedInputStream inputStream = null;
        try {
            //将文件放入缓冲输入流
            inputStream = new BufferedInputStream(inStream);
            //将缓冲输入流写入输出流中
            byte[] cellBuffer = new byte[1024];
            int read = inputStream.read(cellBuffer);
            while (read != -1) {
                outputStream.write(cellBuffer, 0, cellBuffer.length);
                outputStream.flush();
                read = inputStream.read(cellBuffer);
            }
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * @comment : temp.xlsx convert temp_20210102173322.xlsx
     */
    public static String convertFileName(String file) {
        String filename = file.substring(0, file.lastIndexOf("."));
        String fileExt = file.substring(file.lastIndexOf(".") + 1);
        return filename + "_" + DateUtils.getDateSimple() + "." + fileExt;
    }

    /**
     * @comment : get byte[] for file
     */
    public static byte[] getByteArrayByFile(String file) throws Exception {
        InputStream is = new BufferedInputStream(new FileInputStream(file));
        byte[] buffer = new byte[is.available()];
        is.read(buffer);
        is.close();
        return buffer;
    }
}
